package com.server.config.http_interceptor;

import com.server.tools.Code;
import com.server.tools.JWTTools;
import com.server.tools.http_exception.BusinessException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.lang.NonNull;
import org.springframework.lang.NonNullApi;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

@Component
public class OverallInterceptor implements HandlerInterceptor {

    // token验证白名单
    private final List<String> excludeUrlList = Arrays.asList("/accountNumbers/login", "/accountNumbers/register");

    /**
     * 前置拦截
     * @param request 收到的请求
     * @param response 如果需要的话返回响应
     * @param handler 控制器
     * @return 验证结果
     */
    @Override
    public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler){

        for (String url : excludeUrlList) {
            // 如果当前请求的URI与白名单中的某个URL匹配
            if (url.equals( request.getRequestURI())) {
                // 匹配成功，表示这是一个不需要拦截的请求，直接放行
                return true;
            }
        }
        // 验证token,验证失败后JWT做了抛异常的操作,所以这里不用额外做什么
        Map<String, Object> map = JWTTools.checkToken(request.getHeader("Authorization"));
        if(map==null || !map.containsKey("uid")){
            throw new BusinessException("Token中的uid异常", Code.TOKEN_ERR);
        }
        // 设置请求属性,把uid存进去,方便controller调用
        request.setAttribute("uid",map.get("uid"));
        // 走到这里说明验证通过了
        return true;
    }


}
